/**
 * @content 字段功能组件
 * @author  2019-09-16
 */
import { NativeModules } from 'react-native';

let FLDS = NativeModules.JSFields;

import Field from './Field.js';

/**
 * @class Fields
 * @description 扩展字段头
 */
export default class Fields {
  /**
   * 构造一个新的 Fields 对象。
   * @memberOf Fields
   * @returns {Promise.<Fields>}
   */
  async createObj() {
    try {
      var { FieldsId } = await FLDS.createObj();
      var fields = new Fields();
      fields._MGFieldsId = FieldsId;
      return fields;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据索引取字段
   * @memberOf Fields
   * @param index 索引
   * @return {Promise.<Field>}字段对象
   */
  async getField(index) {
    try {
      let { FieldId } = await FLDS.getField(this._MGFieldsId, index);
      var field = new Field();
      field._MGFieldId = FieldId;
      return field;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 设置索引处的字段
   * @memberOf Fields
   * @param index 索引
   * @param field 字段对象
   * @return {Promise.<void>}大于0成功，否则失败
   */
  async setField(index, field) {
    try {
      return await FLDS.setField(this._MGFieldsId, index, field._MGFieldId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 追加字段
   * @memberOf Fields
   * @param field 字段对象
   * @return {Promise}大于0成功，否则失败
   */
  async appendField(field) {
    try {
      return await FLDS.appendField(this._MGFieldsId, field._MGFieldId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 插入字段
   * @memberOf Fields
   * @param position 位置
   * @param field 字段对象
   * @return {Promise}大于0成功，否则失败
   */
  async insertField(position, field) {
    try {
      return await FLDS.insertField(
        this._MGFieldsId,
        position,
        field._MGFieldId
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据字段名删除字段
   * @memberOf Fields
   * @param fldName 字段名
   * @return {Promise}大于0成功，否则失败
   */
  async deleteFieldByName(fldName) {
    try {
      return await FLDS.deleteField(this._MGFieldsId, fldName);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据字段序号删除字段
   * @memberOf Fields
   * @param index 字段序号
   * @return {Promise}大于0成功，否则失败
   */
  async deleteFieldByIndex(index) {
    try {
      return await FLDS.deleteField(this._MGFieldsId, index);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 取字段数目
   * @memberOf Fields
   * @return {Promise}字段数目
   */
  async getFieldCount() {
    try {
      return await FLDS.getFieldCount(this._MGFieldsId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 计算各字段的二进制长度,字段偏移
   * @memberOf Fields
   * @return {Promise}长度偏移值
   */
  async calLengthOffset() {
    try {
      return await FLDS.calLengthOffset(this._MGFieldsId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 计算属性结构占用存储空间大小
   * @memberOf Fields
   * @return {Promise}占用存储空间大小
   */
  async calSize() {
    try {
      return await FLDS.calSize(this._MGFieldsId);
    } catch (e) {
      console.error(e);
    }
  }
}
